'use strict';
const db = uniCloud.database()

// 格式化当前日期时间
function getCurrentDateTime() {  
    const now = new Date();  
    const year = now.getFullYear(); // 获取年份  
    const month = String(now.getMonth() + 1).padStart(2, '0'); // 获取月份，加1是因为月份是从0开始的，并使用padStart补零  
    const date = String(now.getDate()).padStart(2, '0'); // 获取日期，并使用padStart补零  
    const hours = String(now.getHours()).padStart(2, '0'); // 获取小时，并使用padStart补零  
    const minutes = String(now.getMinutes()).padStart(2, '0'); // 获取分钟，并使用padStart补零  
    // 组合日期和时间字符串  
    const formattedDateTime = `${year}-${month}-${date} ${hours}:${minutes}`;  
    return formattedDateTime;  
}

// 获取最近的未来的日期时间
function findNextFutureDate(dates, currentTime) {  
    // 将当前时间转换成Date对象  
    const currentDate = new Date(currentTime);  
  
    // 初始化最大日期为null  
    let maxFutureDate = null;  
  
    // 遍历日期数组  
    for (const dateStr of dates) {  
        // 将字符串转换成Date对象  
        const dateObj = new Date(dateStr.date);  
  
        // 如果日期在未来且是当前遍历到的最早未来日期，或者还没有找到未来日期  
        if (dateObj > currentDate && (!maxFutureDate || dateObj < maxFutureDate)) {  
            maxFutureDate = dateObj;  
        }  
    }  
  
    // 如果没有找到未来日期，返回数组中的最大日期  
    if (!maxFutureDate) {  
        let maxDate = new Date(dates[0].date);  
        for (const dateStr of dates) {  
            const dateObj = new Date(dateStr.date);  
            if (dateObj > maxDate) {
                maxDate = dateObj;  
            }  
        }  
        maxFutureDate = maxDate;  
    }
	
	// 返回找到的最近未来日期的字符串格式 
	if (maxFutureDate) {
		const currentTime = maxFutureDate.toISOString(); // 假定这是UTC时间  
		const currentDate = new Date(currentTime); // 创建Date对象  
		  
		// 8小时转换为毫秒（1小时 = 60分钟 = 60 * 60秒 = 60 * 60 * 1000毫秒）  
		const eightHoursInMilliseconds = 8 * 60 * 60 * 1000;  
		  
		// 将8小时加到当前时间上  
		const newDate = new Date(currentDate.getTime() + eightHoursInMilliseconds);  
		  
		// 输出结果  
		return newDate.toISOString().slice(0, 16).replace('T', ' ')
	}
	return null
}  

exports.main = async (event, context) => {
	// 前端调用此函数需要传入的参数：dbName ，filter ，pageIndex ，pageSize
	var dbName = 'rx'  // 集合名称(表的名称)
	console.log('接收到的搜索参数', event.filter.search)
	
	var filter_or = [
			{ name: event.filter.search },
			{ mobile: event.filter.search },
			{ sex: event.filter.search },
			{ age: event.filter.search },
			{ orderId: event.filter.search },
			{ slipCreateTime: new RegExp(`^${event.filter.search}`) },
			{ clinic: { medic_name: event.filter.search }},
			{ clinic: { medic_mobile: event.filter.search }},
			{ clinic: { clinic_name: event.filter.search }},
			{ clinic: { addressCity: event.filter.search }},
			{ clinic: { addressCounty: event.filter.search }},
			{ clinic: { addressProvince: event.filter.search }},
			{ clinic: { address: event.filter.search }},
		]
	
	if (event.types < 2 ) {
		var filter_and = { clinic: { clinicId: db.command.in(event.filter.clinic) }, delete: 0 }
		if (event.types === 1) {
			filter_and.clinic.medic_userId = event.filter.medicId
		}
		if (!event.filter.search) {
			var filter = filter_and
		} else {
			var filter = db.command.or(filter_or).and(filter_and)
		}
	}
	
	if (event.types === 2) {	// 只过滤用户自己或者已关联自己的数据
		const selfs = [{name: event.name, mobile: event.mobile}]
		for (let i = 0; i < event.self_list.length; i++) {
			selfs.push({name: event.self_list[i].name, mobile: String(event.self_list[i].mobile)})
		}
		var filter_and = db.command.or(selfs)
		if (!event.filter.search) {
			var filter = filter_and
		} else {
			var filter = db.command.or(filter_or).and(filter_and)
		}
	}
	
	if (event.types === 3) {	//  复诊电手只需要获取到需要复诊的数据db.command.size
		var filter_and = { visits: { date: db.command.neq([]) } }
		if (!event.filter.search) {
			var filter = filter_and
		} else {
			var filter = db.command.or(filter_or).and(filter_and)
		}
	}
	
	var pageIndex = event.pageIndex ? event.pageIndex : 1 ;  // 当前第几页，默认为第一页
	var pageSize = event.pageSize ? event.pageSize : 10 ;  // 每页取多少条记录，默认为10条  

	const countResult = await db.collection(dbName).where(filter).count()  // 获取集合中的总记录数
	const total = countResult.total  // 得到总记录数 
	const totalPage = Math.ceil(total / pageSize)  // 计算页数

	var has_more ;  // 提示前端是否还有数据
	if (pageIndex > totalPage || pageIndex == totalPage) {  // 如果没有数据了，就返回false
		has_more = false 
	} else {
		has_more = true 
	}

	// 查询数据并返回给前端cloud.database.Command.in([111, 222]) 
	const res = await db.collection(dbName).where(filter).skip((pageIndex - 1) * pageSize).limit(pageSize).orderBy('slipCreateTime', 'desc').get()
	res.has_more = has_more
	
	// 重构复诊日期：加入新元素 visits_date，筛选出最近要到达的日期，如果没有则显示最后一个日期。如果无需复诊则留空字符串
	for (let i = 0; i < res.data.length; i++) {
		if (res.data[i].visits.date.length > 0) {
			if (res.data[i].visits.date.length === 1) {
				res.data[i].visits.now_visit_date = res.data[i].visits.date[0].date
			} else {
				res.data[i].visits.now_visit_date = findNextFutureDate(res.data[i].visits.date, getCurrentDateTime())
			}
		} else {
			res.data[i].visits.now_visit_date = ""
		}
	}

	return { data: res, code: 200, msg: 'ok.' }  // 返回json给客户端
	   
};
